package com.zrh.jsd.service.studydemo.common_test;

import lombok.Getter;

/*
* 局部变量：每个线程执行时都会把局部变量放在各自的栈帧的内存空间中，线程间不共享，故不存在线程安全问题
* 静态变量：也称为类变量，属于类对象所有，位于方法区，为所有对象共享，共享一份内存，一旦值被修改，其他对象对修改可见，故线程非安全。
* static只是声明变量在主存上的唯一性，不能保证工作区与主存区变量值的一致性；除非变量的值是不可变的，即再加上final的修饰符，否则static声明的变量，不是线程安全的
* volatile声明这个字段是易变的，即一致性。
*
* 在非静态的wrong方法上加锁，只能保证保证多个线程无法执行同一个实例的wrong方法，却不能保证不会执行不同实例的wrong方法，
* 而静态的counter在多个实例中共享，所以必然会出现线程安全问题。
*
* 精细化考虑锁应用范围，即使我们确实有一些共享资源需要保护，也要尽可能降低锁的粒度，仅对必要的代码块甚至是需要保护的资源本身加锁。
* */
public class Data {
    @Getter
    private static int counter = 0;
    private static Object locker = new Object();

    public static int reset() {
        counter = 0;
        return counter;
    }

    public synchronized void wrong() {
        counter++;
    }

    public void right(){
        synchronized (locker){
            counter++;
        }
    }

}